
package br.uefs.ecomp.redeneural.model;

/**
 *
 * @author Beto
 */
public class Calculos {

    public static double sigmoide(double valor) {
        double sigmoide = 1 / (1 + Math.pow(Math.E, (-1) * (0.5 * valor)));
        return sigmoide;
    }

    public static double derivadaSigmoide(double valor) {
        double derivada = 0.5 * sigmoide(valor) * (1 - sigmoide(valor));
        return derivada;
    }

    public static double gradienteLocalUltimaCamada(double saidaDesejada, double saidaEncontrada, double somatorio) {
        double gradiente = (saidaDesejada - saidaEncontrada) * derivadaSigmoide(somatorio);
        return gradiente;
    }

    public static double gradienteLocalCamadasOcultas(Neuronio neuronio, Camada camadaPosterior, int iteracao) {
        double gradiente = 0;
        double somador = 0;

        for(int i = 0; i < camadaPosterior.getNeuronios().size(); i++) {
            somador += camadaPosterior.getNeuronios().get(i).getUltimoGradienteLocal() *
                    camadaPosterior.getNeuronios().get(i).getPesos()[iteracao];
        }

        gradiente = derivadaSigmoide(neuronio.somatorio()) * somador;
        return gradiente;
    }

}
